//
// Created by 马皓然 on 2025/10/25.
//
#include "can_cybergear.h"
#include <string.h>
/**
 * @brief  发送 CyberGear 电机 CAN 消息
 * @param  hcan: 指向 CAN_HandleTypeDef 结构体的指针
 * @param  tx_message: 指向待发送 CAN 消息结构体的指针
 * @retval HAL_OK: 发送请求成功；HAL_ERROR: 失败
 */
uint8_t CyberGear_CAN_SendMessage(CAN_HandleTypeDef *hcan, const CyberGear_Message_t *tx_message) {
    CAN_TxHeaderTypeDef TxHeader;
    uint32_t TxMailbox;

    // 1. 检查数据长度
    if (tx_message->DLC > 8) {
        return HAL_ERROR;
    }

    // 2. 配置发送头
    TxHeader.StdId = 0x000;                     // 标准 ID (未使用)
    TxHeader.ExtId = tx_message->ID;            // 完整的 29 位扩展 ID
    TxHeader.RTR = CAN_RTR_DATA;                // 数据帧
    TxHeader.IDE = CAN_ID_EXT;                  // **必须为扩展帧**
    TxHeader.DLC = tx_message->DLC;             // 数据长度

    // 3. 发送消息
    // HAL_CAN_AddTxMessage 函数会检查是否有空闲邮箱，并自动填充
    if (HAL_CAN_AddTxMessage(hcan, &TxHeader, (uint8_t *)tx_message->Data, &TxMailbox) != HAL_OK) {
        // 发送失败，所有邮箱忙碌
        return HAL_ERROR;
    }
    return HAL_OK; // 发送请求成功
}

